// 随着更多验证器的加入，我们需要一种手段来组织代码，以便于在记录它们类型的同时还不用担心与其它对象产生命名冲突。

/// <reference path="./types/Validation.ts" />
/// <reference path="./types/LettersOnlyValidator.ts" />
/// <reference path="./types/ZipCodeValidator.ts" />

// namespace Validation {
//   export interface StringValidator {
//     isAcceptable(s: string): boolean
//   }

//   const lettersRegexp = /^[A-Za-z]+$/
//   const numberRegexp = /^[0-9]+$/

//   export class LettersOnlyValidator implements StringValidator {
//     isAcceptable(s: string) {
//       return lettersRegexp.test(s)
//     }
//   }

//   export class ZipCodeValidator implements StringValidator {
//     isAcceptable(s: string) {
//       return s.length === 5 && numberRegexp.test(s)
//     }
//   }
// }
// interface StringValidator {
//   isAcceptable(s: string): boolean
// }

// let lettersRegexp = /^[A-Za-z]+$/
// let numberRegexp = /^[0-9]+$/

// 重载
// class LettersOnlyValidator implements StringValidator {
//   isAcceptable(s: string) {
//     return lettersRegexp.test(s)
//   }
// }

// class ZipCodeValidator implements StringValidator {
//   isAcceptable(s: string) {
//     return s.length === 5 && numberRegexp.test(s)
//   }
// }

// Some samples to try
let strings = ['Hello', '98052', '101']

// Validators to use
let validators: { [s: string]: Validation.StringValidator } = {}
validators['ZIP code'] = new Validation.ZipCodeValidator()
validators['Letters only'] = new Validation.LettersOnlyValidator()

// console.log(validators, 'validators')
// Show whether each string passed each validator
for (let s of strings) {
  console.log(s, 's')
  for (let name in validators) {
    let isMatch = validators[name].isAcceptable(s)
    console.log(`'${s}' ${isMatch ? 'matches' : 'does not match'} '${name}'.`)
  }
}

// 分离到多文件
